#include <stdio.h>/*该文件包含pringtf()等函数*/
#include <stdlib.h>/*该文件包含exit()等函数*/
#include <malloc.h>/*该文件包含malloc()等函数*/

typedef int DataType;/*定义DataType为int*/


typedef struct Node
{
    DataType data;
    struct Node *next;
} SLNode;


/*单链表初始化。初始化成功函数返回0，否则返回1。*/
int ListInitiate(SLNode **head)
{
    *head = (SLNode *)malloc(sizeof(SLNode));
    (*head)->next=NULL;
    if(*head == NULL)
        return 1;
    else
        return 0;
}

/* 函数返回由head所表示的单链表的长度。*/
int ListLength(SLNode *head)
{
    int size=0;
    SLNode *p = head;
    while(p ->next != NULL){
        p = p ->next;
        size++;
    }
    return size;
    }

// 在由head所表示的单链表里插入一个元素 x 到位置 i。
// 插入成功函数返回0，否则返回1。
int ListInsert(SLNode *head, int i, DataType x)
{
    SLNode *p,*s;
    int j = -1;
    p = head;
    while(p ->next != NULL && j < i - 1){
        p = p ->next;
        j++;
    }
    if(j != i-1){
        printf("i值不合法！");
        return 1;
    }
    s = (SLNode *)malloc(sizeof(SLNode));
    s ->data = x;
    s ->next = p -> next;
    p ->next = s;

    return 0;
}

// 在由head所表示的单链表里删除位置 i 上的元素并将其值存入 x 变量里。调用成功后列表长度减1。
int ListDelete(SLNode *head, int i, DataType *x)
{
    int j = -1;
    SLNode *p,*s;
    p = head;
    while(p ->next != NULL && j < i - 1){
        p = p -> next;
        j++;
    }
    if(j != i-1){
        printf("i值不合法！");
        return 1;
    }
    s = p ->next;
    *x = s ->data;
    p ->next = s ->next;
    free(s);
    return 0;
}

// 在由head所表示的单链表里获取位置 i 上的元素并将其值存入 x 变量里。调用成功后，列表长度不变。
int ListGet(SLNode *head, int i, DataType *x)
{
    int j = -1;
    SLNode *p;
    p = head;
    while(p ->next != NULL && j < i){
        p = p -> next;
        j++;
    }
    while(j != i){
        printf("i的值不合法！");
        return 1;
    }
    *x = p ->data;
    return 0;
}

// 释放所有的由head所表示的单链表里的元素节点（含头结点）。当释放完全成功时，函数返回0，否则返回1。
int Destroy(SLNode **head)
{
    SLNode *p, *p1;
    p = *head;
    while(p != NULL)
    {
        p1 =  p;
        p = p->next;
        free(p1);
    }
    *head = NULL;
    return 0;
}
void main()
{
    SLNode *head;
    int i , x;
    ListInitiate(&head);/*初始化*/
    for(i = 0; i < 10; i++) {
        if(ListInsert(head, i, i+1) == 1) /*插入10个数据元素*/
        {
            printf("错误! \n");
            system("pause");
        }
    }

    if(ListDelete(head, 4, &x) == 1) { /*删除数据元素5*/
        printf("错误! \n");
        system("pause");

    }
    printf("%d\n", ListLength(head));

    for(i = 0; i < ListLength(head); i++) {
        if(ListGet(head, i, &x) == 1) /*取元素*/
        {
            printf("错误! \n");
            system("pause");
        }
        else printf("%d    ", x);/*显示数据元素*/
    }
    //Destroy(&head);
    system("pause");

}